const UsersServices = require('../services/usersServices')

class UsersControllers {
  constructor() {
    // 显式地将所有方法绑定到类的实例
    this.addNewUser = this.addNewUser.bind(this)
    this.delUserById = this.delUserById.bind(this)
    this.updateUserById = this.updateUserById.bind(this)
    this.getAllUsers = this.getAllUsers.bind(this)
    this.getUserById = this.getUserById.bind(this)
    this.getUserByAccount = this.getUserByAccount.bind(this)
    this.layout = this.layout.bind(this)
  }

  handleRequest = async (serviceMethod, req, res, successStatus = 200) => {
    try {
      const result = await serviceMethod(req)
      if (result.code === 0) {
        res.status(successStatus).json(result) // 成功
      } else {
        res.status(result.statusCode || 400).json(result) // 失败
      }
    } catch (error) {
      res.status(500).json({
        code: 1,
        msg: '服务器内部错误',
      })
    }
  }

   /**
   * 用户登录
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
async login(req, res) {
  const { account, password } = req.body // 从请求体中获取账号和密码
  const result = await UsersServices.login(account, password)

  if (result.code === 0) {
    // 将 Token 设置到 Cookie 中
    res.cookie('token', result.data.token, {
      httpOnly: true, // 防止客户端 JavaScript 访问 Cookie
      maxAge: 60 * 60 * 60, // 过期时间（1 小时）
      secure: process.env.NODE_ENV === 'production', // 在生产环境中启用 HTTPS
      sameSite: 'strict', // 防止 CSRF 攻击
    })

    // 返回登录成功信息（不返回 Token）
    res.status(200).json({
      result
    })
  } else {
    res.status(result.statusCode || 400).json(result) // 失败
  }
}

    /**
   * 用户退出登录
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  async layout(req, res) {
    try {
      // 清除客户端的 Cookie
      res.clearCookie('token')

      // 返回成功响应
      res.status(200).json({
        msg: '退出登录成功',
      })
    } catch (error) {
      res.status(400).json({ e: error.message })
    }
  }

  /**
   * 用户注册
   * @param {*} req 
   * @param {*} res 
   */
  async addNewUser(req, res) {
    const { nickname, account, password } = req.body;

    // 校验昵称是否为空
  if (!nickname.length) {
    return res.status(404).json({
      code: 0,
      msg: '昵称不能为空',
    })
  }

  // 校验账号和密码长度是否大于等于6
  if (account.length < 6 || password.length < 6) {
    return res.status(404).json({
      code: 0,
      msg: '账号和密码长度都必须大于等于6',
    })
  }

  // 校验账号是否包含中文
  const chineseRegex = /[\u4e00-\u9fa5]/;
  if (chineseRegex.test(account)) {
    return res.status(404).json({
      code: 0,
      msg: '账号不能包含中文',
    })
  }

    // 如果校验通过，继续处理请求
    await this.handleRequest(
      () => UsersServices.addNewUser(req.body),
      req,
      res,
      201
    )
  }

  async delUserById(req, res) {
    await this.handleRequest(
      () => UsersServices.delUserById(req.params.id),
      req,
      res,
      200
    )
  }

  async updateUserById(req, res) {
    await this.handleRequest(
      () => UsersServices.updateUserById(req.params.id, req.body),
      req,
      res
    )
  }

  async getAllUsers(req, res) {
    await this.handleRequest(
      () => UsersServices.getAllUsers(),
      req,
      res
    )
  }

  async getUserById(req, res) {
    await this.handleRequest(
      () => UsersServices.getUserById(req.params.id),
      req,
      res
    )
  }

  async getUserByAccount(req, res) {
    await this.handleRequest(
      () => UsersServices.getUserByAccount(req.params.acc),
      req,
      res
    )
  }
}

module.exports = new UsersControllers()